# 策略模式

# ⭐=> 策略模式是一种行为型设计模式，它定义了一系列算法，并将每个算法封装起来，使它们可以相互替换，且算法的变化不会影响使用算法的客户。

# 角色
# 上下文: 维护一个对策略对象的引用，并且定义了一个接口，用于访问策略对象的方法
# 策略: 定义了一个算法的接口，并且包含了具体的算法实现
# 具体策略: 实现了策略接口，定义了具体的算法实现

from abc import ABCMeta, abstractmethod
class Strategy(metaclass=ABCMeta):
    @abstractmethod
    def execute(self):
        pass

class ConcreteStrategyA(Strategy):
    def execute(self):
        print("ConcreteStrategyA execute")

class ConcreteStrategyB(Strategy):
    def execute(self):
        print("ConcreteStrategyB execute")

class Context:
    def __init__(self, strategy: Strategy = None):
        self.strategy = strategy

    def setStrategy(self, strategy: Strategy):
        self.strategy = strategy

    def execute(self):
        self.strategy.execute()

if __name__ == "__main__":
    context = Context()
    context.setStrategy(ConcreteStrategyA())
    context.execute()
    context.setStrategy(ConcreteStrategyB())
    context.execute()
    # Output: ConcreteStrategyA execute ConcreteStrategyB execute
